package code.example.base.collection.map;

import code.example.tool.LogFactory;

import java.util.HashMap;
import java.util.IdentityHashMap;
import java.util.Map;
import java.util.function.BiConsumer;

/**
 *   IdentityHashMap 使用==判断key相同，即同一个对象。
 *
 *  IdentityHashMap 内部采用数组，通过key 生成的hashCode（System.identityHashCode 根据内存地址生成hashCode）
 *  映射到数组下标，存放KEY,下标+1存放value.（偶数下标存key ,奇数下标存value）
 *
 *  由于数组中存在key 和value ,因此数组长度=预计存放key个数的2倍。
 *  当key个数*2 >数组长度时，扩容==>数组长度*2
 *
 *  数组长度默认值为32，如果给定capacity ,则是大于capacity的2的N次方。
 *
 *  HashCode 找到数组下标：
 *     hashcode 左移2位，变成偶数 & (数组长度-1) ==下标
 *
 */
public class TestIdentityHashMap {

    public void test(){
        int count = 100;
        Map<Integer,Integer > map = new IdentityHashMap<>((int)(count/0.75));
        for(int i=0;i<count;i++){
            Integer key = Integer.valueOf(i);
            map.put(key,key);
        }
        map.get(Integer.valueOf(10));
        map.forEach(new BiConsumer<Integer, Integer>() {
            @Override
            public void accept(Integer key, Integer value) {
                LogFactory.getLog().info("key:"+key+",value:"+value+" ,key:"+Integer.toBinaryString(key)+",value:"+Integer.toBinaryString(value));
            }
        });
    }
    public static void main(String args []){
        new TestIdentityHashMap().test();
    }
}
